<?php
    class CandidatoVaga extends BaseModel
    {
    	
    	protected $candidatovagaid;
    	protected $vagaid;
        protected $candidatoid;
        protected $adminissaosugestao;
        protected $admissao;
        protected $demissao;
        protected $registroterceirizada;
        protected $ativo;

        const tablename = "candidatovaga";
    	const tablekey = "candidatovagaid";
    	const tablesequence = "candidatovaga_candidatovagaid_seq";
        
      	public function alterarStatusBloco($bloco, $status) 
      	{
			$sql = "UPDATE " . self::tablename ." SET statusid = $status WHERE " . self::tablekey . " in (";
			for($i = 0; $i < count ( $bloco ); $i ++) {
				$sql .= $bloco [$i];
				if ($i < count ( $bloco ) - 1) {
					$sql .= ",";
				} else {
					$sql .= ")";
				}
			}
									
			pg_query ( conexao::Conectar (), $sql ) or die ( "Erro ao excluir." );
		}
		
		public function candidatoAtivo( $vagaid )
		{
			if ( is_numeric( $vagaid ) ){
			
				$sql = "SELECT " . self::tablekey . " as id FROM " . self::tablename . " WHERE ativo = true AND vagaid = $vagaid LIMIT 1";
				$result = TUtils::CriarResultSet($sql);
				$object = pg_fetch_object( $result );
				if ( $object )
					parent::__construct( $object->id );
						
			}
		}
		
		public function historicoMaisRecente( $vagaid )
		{
			if ( is_numeric( $vagaid ) ){
				
				$candidatoVagaHistorico = new CandidatoVagaHistorico();
				
				$sql  = "SELECT " . self::tablekey . " as id FROM " . $candidatoVagaHistorico->getTableName();
				$sql .= " WHERE " . self::tablekey . " IN";
				$sql .= " ( SELECT " . self::tablekey . " FROM " . self::tablename . " WHERE vagaid = $vagaid )";
				$sql .= " ORDER BY dataregistro DESC LIMIT 1";
				
				$result = TUtils::CriarResultSet($sql);
				$object = pg_fetch_object( $result );
				if ( $object )
					parent::__construct( $object->id );
				
			}
			
		}
		
		public function getStatusAtual()
		{
			if ( $this->candidatovagaid ){
			
				$sql = "SELECT statusid FROM candidatovagahistorico WHERE candidatovagaid = " . $this->candidatovagaid . " AND dataregistro IS NOT NULL ORDER BY dataregistro DESC LIMIT 1";
				
				$result = pg_fetch_object(TSqlSelect::customSelect($sql));
				
				$statusid = ( $result ) ? $result->statusid : 0;
				
				return $statusid;
			
			}
			else return null;
			
		}
		
		public function salvar($verificar=true) 
		{
		    if ($verificar){
    			if ( !$this->verificarRegistroTerceirizada() )
    				throw new Exception("Registro Terceirizada já utilizado.");
		    }
			parent::salvar();
		}
		
		/**
		 * Verifica o número de matrícula do candidato na terceirizada
		 * @param $vagaid
		 * @param $registroTerceirizada
		 * @return boolean
		 */
		public function verificarRegistroTerceirizada($vagaid = NULL, $registroTerceirizada = NULL, $candidatoid = NULL)
		{
		    // Dados insuficientes
			if ((!$this->registroterceirizada AND $registroTerceirizada == NULL) OR $this->ativo == FALSE) {
				return TRUE;
			}
			
			$candidatoid          = ($candidatoid) ? $candidatoid : $this->candidatoid;
			$registroTerceirizada = ($registroTerceirizada) ? $registroTerceirizada : $this->registroterceirizada;
			$vagaid               = ($vagaid) ? $vagaid : $this->vagaid;
			$vaga                 = new Vaga($vagaid);
			$contrato             = new Contrato($vaga->contratoid);
			$empresaid            = $contrato->empresaid;
			
			// O registro da terceirizada nao pode se repetir no mesmo contrato e na mesma empresa 
			$sql = "SELECT count(*) AS total 
					FROM candidatovaga cv , vaga v, contratos c 
					WHERE cv.vagaid = v.vagaid 
						  AND v.contratoid = c.contratoid  
						  AND c.empresaid = $empresaid  
						  AND cv.ativo IS TRUE 
						  AND c.ativo IS TRUE 
						  AND cv.registroterceirizada = '" . $registroTerceirizada . "'";
			
			// Se tem candidatoid, restringe tambem o candidato
			if ($candidatoid) {
			    $sql .= " AND cv.candidatoid <> $candidatoid";
			}
			
            $result = pg_fetch_object(pg_query(conexao::Conectar(), $sql));
			if ($result->total > 0) {
				return FALSE;
			}
			
			return TRUE;
		}
        
		public function getCandidatoInformado($vagaid)
		{
			
			$sql  = "SELECT " . $this->getTableKey() . " as id FROM " . $this->getTableName() . " AS cv";
			$sql .= " WHERE cv.vagaid = $vagaid AND cv.ativo = FALSE AND cv.admissao IS NULL";
			$sql .= " AND cv.candidatovagaid NOT IN ( SELECT cvh.candidatovagaid FROM candidatovagahistorico as cvh WHERE cvh.candidatovagaid = cv.candidatovagaid ) ";
			
			$result = TSqlSelect::customSelect( $sql );
			
			if ( pg_num_rows ( $result ) > 0 ){
				$objeto = pg_fetch_object( $result );
				return $objeto->id;
			}
			
			return false;
		}
		
		/**
		 *@return MovimentacoesCandidatoVaga
		 */
		public function getMovitacoesCandidatoVagaDestino()
		{
			$movimentacao = null;
			$sql = "SELECT movimentacoescandidatovagaid  as id
	            				FROM movimentacoescandidatovaga 
	            				WHERE candidatovagaiddestino = ".$this->candidatovagaid;
            $sql.= "ORDER BY dataregistro DESC LIMIT 1";
            
            $result = TUtils::CriarResultSet($sql);
            if (pg_num_rows($result)>0){
            	$obj= pg_fetch_object($result);
            	$movimentacao = new MovimentacoesCandidatoVaga($obj->id);
            }
            return $movimentacao;
		}
		
     	/**
     	 * @return MovimentacoesCandidatoVaga
		 */
		public function getMovitacoesCandidatoVagaOrigem()
		{
			$sql = 'SELECT movimentacoescandidatovagaid AS id
    				FROM movimentacoescandidatovaga 
    				WHERE 
    					candidatovagaidorigem = ' . $this->candidatovagaid . '
    					AND candidatovagaiddestino IS NULL 
					ORDER BY dataregistro DESC LIMIT 1';
            
            $result = TUtils::CriarResultSet($sql);
            
            $movimentacaocandidatoid = NULL;
            
            if (pg_num_rows($result) > 0) {
            	$obj= pg_fetch_object($result);
            	$movimentacaocandidatoid = $obj->id;
            }
            return new MovimentacoesCandidatoVaga($movimentacaocandidatoid);
		}
		
		/**
		 * 
		 * @return Vaga
		 */
		public function getVaga()
		{
			$vaga = new Vaga($this->vagaid);
			return $vaga;
		}
		
		/**
		 * @return Candidato
		 */
		public function getCandidato()
		{
			$candidato = new Candidato($this->candidatoid);
			return $candidato;
		}
		
    	public function getHistorico()
    	{
			if (!$this->candidatovagaid) {
				return NULL;
			}
			
			$candidatovagahistorico = new CandidatoVagaHistorico();
			return $candidatovagahistorico->listar( array( 'campo' => self::tablekey, 'operador' => '=', 'valor' => $this->getTableKeyValue() ) );
		}
		
		/**
		 * 
		 * @return CandidatoVagaHistorico
		 */
		public function getHistoricoAtual(){
			
			if ( !$this->candidatovagaid )
				return new CandidatoVagaHistorico();
			
			$candidatovagahistorico = new CandidatoVagaHistorico();
			
			$sql = "SELECT " . CandidatoVagaHistorico::tablekey . " FROM " . CandidatoVagaHistorico::tablename . " WHERE " . $this->getTableKey() . " = " . $this->getTableKeyValue() . " AND dataregistro IS NOT NULL ORDER BY dataregistro DESC LIMIT 1";
			
			$query = TSqlSelect::customSelect($sql);
			
			if ( pg_num_rows( $query ) == 0 )
				return new CandidatoVagaHistorico();
			
			$result = pg_fetch_object( $query );
			
			if ( !$result->candidatovagahistoricoid )
				return new CandidatoVagaHistorico();
				
			return new CandidatoVagaHistorico( $result->candidatovagahistoricoid );
			
		}
		
		/**
		 * Retorna todas as solicitacoes de permuta
		 * @return array
		 */
		public function getSolicitacaoRelotacao(){
		    
		    if ( !$this->candidatovagaid )
				return NULL;
		    
		    $permuta =  new SolicitacaoRelotacao();
		    $criteria = array('campo'=>'candidatovagaid','operador'=>'=','valor'=>$this->candidatovagaid);
		    return $permuta->listar($criteria);
		}
		
        public function inserirHistorico( $statusid, $observacao = NULL, $intervaloSegundos = 0 )
        {
            global $usuario;
            
            date_default_timezone_set('America/Sao_Paulo');
		
            //alterando a data de hoje para adicionar segundos, garatindo a ordem do historico do candidatovaga
    		$hoje = mktime( date('H'), date('i'), date('s'), date('m'), date('d'), date('Y') ); 
    		$novaData = $hoje + $intervaloSegundos;
    		
    		$candidatoVagaHistorico = new CandidatoVagaHistorico();
    		$candidatoVagaHistorico->candidatovagaid = $this->candidatovagaid;
    		$candidatoVagaHistorico->statusid = $statusid;
    		$candidatoVagaHistorico->observacao = $observacao;
    		$candidatoVagaHistorico->operadorid = $usuario->operadorid;
    		$candidatoVagaHistorico->dataregistro = date('Y-m-d H:i:s',$novaData);
    		$candidatoVagaHistorico->salvar();
    	}
    	
        public function registrarMovimentacao($vagaiddestino)
    	{
    	    global $usuario;
    	    
    	    $movimentacao_candidato_vaga = new MovimentacoesCandidatoVaga();
    	    $movimentacao_candidato_vaga->candidatovagaidorigem = $this->candidatovagaid;
            $movimentacao_candidato_vaga->dataregistro = date('Y-m-d H:i:s');
            $movimentacao_candidato_vaga->operadorid = $usuario->operadorid;
            $movimentacao_candidato_vaga->vagadestino = $vagaiddestino;
            $movimentacao_candidato_vaga->salvar();
    	}
    	
    	public function isRelotado()
    	{
    	    $historico = $this->getHistorico();
    	    
    	    if (pg_num_rows($historico) == 0) {
    	        return FALSE;
    	    }
    	    
    	    $historico = pg_fetch_all($historico);
            foreach ($historico as $h) {
        	    if ($h['statusid'] == Status::Candidato_Relotado){
	    			return TRUE;
	    	    }
	    	}
	    	
	    	return FALSE;
    	}
    	
    	public function isVinculacaoFinalizada()
    	{
    	    $historico = $this->getHistorico();
            
    	    if ($this->ativo === 'f') {
    	        return FALSE;
    	    }
    	    
            if (pg_num_rows($historico) == 0) {
                return FALSE;
            }
            
            $historico = pg_fetch_all($historico);
            foreach ($historico as $h) {
                if ($h['statusid'] == Status::Candidato_ContratacaoFinalizada){
                    return TRUE;
                }
            }
            
            return FALSE;
    	}
	}
?>